/*******************************************************************************
 *  版权所有 2009-2023山东新北洋信息技术股份有限公司 保留所有权利。                     *
 ******************************************************************************/

/*******************************************************************************
 * Copyright (c) 2023. 山东新北洋信息技术股份有限公司 保留所有权利。
 *
 ******************************************************************************/


package online.xuping.thousandsOfWorlds.util;

import lombok.SneakyThrows;
import org.apache.commons.codec.binary.Base64;

import javax.crypto.Cipher;
import java.nio.charset.StandardCharsets;
import java.security.KeyFactory;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.X509EncodedKeySpec;

/**
 * RSA加密,解密
 *
 * @Author: 牛海亮
 * @CreateDate: 2021年12月9日 上午10:14:43
 * @Version: 1.0
 */
public final class RSAEncryptUtil {
    public static final String RSA = "RSA";
    private static final String PUBLICKEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCbP+A" +
            "/kdZ2aPwT0OCtbpmS1olIkOz7QauUgdwoGm5SG9LlHqo6AhkNs/zb4z1Lncge"
            + "+WlMurRH4tqQCXv5WTLT6P7XHDDdkOUyCxt0FNHWg8IAc5CHbcjgD/64lrTELHwdGbe7AF3W2D4yHWsWIRs6Xl8b2+oyL6b9VPM" +
            "+Eb4POwIDAQAB";

    private RSAEncryptUtil() {
        throw new IllegalStateException("Utility class");
    }

    public static String encrypt(String str) {
        return encrypt(str, PUBLICKEY);
    }

    /**
     * 加密
     *
     * @param str
     * @param publicKey
     * @return
     * @throws Exception 参数 参数
     * @author: 牛海亮
     * @date: 2021年12月9日 上午11:12:21
     */
    @SneakyThrows
    public static String encrypt(String str, String publicKey) {
        //base64编码的公钥
        byte[] decoded = Base64.decodeBase64(publicKey);
        RSAPublicKey pubKey =
                (RSAPublicKey) KeyFactory.getInstance(RSA).generatePublic(new X509EncodedKeySpec(decoded));
        //RSA加密
        Cipher cipher = Cipher.getInstance(RSA);
        cipher.init(Cipher.ENCRYPT_MODE, pubKey);
        return Base64.encodeBase64String(cipher.doFinal(str.getBytes(StandardCharsets.UTF_8)));
    }

}
